const WebSocket = require('ws');

// 创建WebSocket服务器，监听8080端口
const wss = new WebSocket.Server({ port: 8080 });

// 存储所有连接的客户端
const clients = new Set();

// 当有新的客户端连接时
wss.on('connection', (ws) => {
  console.log('客户端已连接');
  
  // 将新客户端添加到集合中
  clients.add(ws);
  
  // 发送欢迎消息
  ws.send('欢迎连接到WebSocket服务器！');
  
  // 当收到客户端消息时
  ws.on('message', (message) => {
    console.log('收到消息:', message.toString());
    
    // 广播消息给所有客户端（除了发送者）
    broadcastMessage(message, ws);
  });
  
  // 当客户端断开连接时
  ws.on('close', () => {
    console.log('客户端已断开连接');
    
    // 从集合中移除客户端
    clients.delete(ws);
  });
  
  // 处理错误
  ws.on('error', (error) => {
    console.error('WebSocket错误:', error);
  });
});

// 广播消息给所有客户端（除了发送者）
function broadcastMessage(message, sender) {
  clients.forEach((client) => {
    // 确保客户端处于打开状态，且不是发送者
    if (client !== sender && client.readyState === WebSocket.OPEN) {
      client.send(message.toString());
    }
  });
}

// 生成模拟JSON数据的函数
function generateMockData() {
  return {
    timestamp: new Date().toISOString(),
    temperature: (Math.random() * 30 + 10).toFixed(1),
    humidity: (Math.random() * 50 + 30).toFixed(1),
    pressure: (Math.random() * 10 + 1000).toFixed(1),
    status: Math.random() > 0.8 ? 'warning' : 'normal',
    devices: [
      { id: 1, name: '设备1', value: Math.floor(Math.random() * 100) },
      { id: 2, name: '设备2', value: Math.floor(Math.random() * 100) },
      { id: 3, name: '设备3', value: Math.floor(Math.random() * 100) }
    ]
  };
}

// 向所有连接的客户端发送模拟数据
function sendMockDataToAll() {
  const mockData = generateMockData();
  const dataString = JSON.stringify(mockData);
  
  console.log('发送模拟数据:', dataString);
  
  clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(dataString);
    }
  });
}

// 设置定时器，每分钟发送一次模拟数据
const dataInterval = setInterval(sendMockDataToAll, 10000);

// 服务器启动成功
console.log('WebSocket服务器已启动，监听端口8080');

// 首次启动立即发送一次数据
sendMockDataToAll();

// 处理进程终止信号，优雅地关闭服务器
process.on('SIGINT', () => {
  console.log('正在关闭WebSocket服务器...');
  
  // 清除定时器
  clearInterval(dataInterval);
  console.log('已停止数据推送定时器');
  
  wss.close(() => {
    console.log('WebSocket服务器已关闭');
    process.exit(0);
  });
});